package com.wyb.hzmt.static_baseFrame_tools0.framework;

import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import com.lidroid.xutils.ViewUtils;
import com.wyb.hzmt.static_baseFrame_tools0.R;
import com.wyb.hzmt.static_baseFrame_tools0.eventbus.TestEvent;
import com.wyb.hzmt.static_baseFrame_tools0.tools.BaseLog;
import de.greenrobot.event.EventBus;
import de.greenrobot.event.Subscribe;


/**
 * Created by Administrator on 2017/3/6.
 * 共17个方法
 * 1、生命周期方法组，共4个
 * 2、点击事件方法组，方法数共2
 * 3、onCreate内部方法组，方法数为4
 * 5、键盘控制方法组，方法数为1
 * 6、进度条方法组，方法数为3
 * 7、获取宽高的方法组，方法数共2
 * 8、SnackBar的方法组，方法数共１
 */

public abstract class MyBaseActivity extends AppCompatActivity implements View.OnClickListener{

    private ProgressDialog progressDialog;
    private Handler handler = new Handler();

    /***
     * 1、生命周期方法组，共4个
     * 这个方法先于oncreate执行
     * @param newBase
     */
    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(newBase);
    }
    /***
     * 尽管有很多说法让onNewIntent做和onCreate一样的数据初始化操作。
     * 但是经实际应用，还是仅仅做intent的更新操作更合理
     */
    @Override
    protected void onNewIntent(Intent intent) {
        setIntent(intent);//使activty可以获取新的intent
        //似乎不做和oncreate同一级别的数据操作，是更合理的。比如添加到已启动Activity集合这种事
        super.onNewIntent(intent);
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentLayout();
        ViewUtils.inject(this);
        EventBus.getDefault().register(this);
        MyApplication.getInstance().addActivity(this);//添加activity到管理集合
        beforInitView();
        initView();
        afterInitView();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        EventBus.getDefault().unregister(this);
        MyApplication.getInstance().RemoveActivity(this);
    }

    /***
     * 2、点击事件方法组，方法数共2
     */
    @Override
    public void onClick(View view) {
        BaseLog.e("login","点击——onClick");
        onClickEvent(view);
    }
    /**
     * onClick方法的封装，在此方法中处理点击事件
     * 需要注意的是
     * @param view 被点击的View对象
     */
    abstract public void onClickEvent(View view);

    /***
     * 3、onCreate内部方法组，方法数为4
     * 读取布局文件
     */
    abstract public void setContentLayout();
    /***
     * 初始化布局前的操作
     */
    abstract public void beforInitView();

    /**
     * 初始化布局
     */
    abstract public void initView();

    /***
     * 初始化布局后的操作
     */
    abstract public void afterInitView();


    /**
     * 5、键盘控制方法组，方法数为1
     * 点击空白位置 隐藏软键盘
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
//        若获取焦点的editview在activity上。那么触摸屏幕时，若无子view响应点击事件，就去关闭键盘。这里并没有检查键盘是否已弹出。
        if (null != getCurrentFocus()) {
            InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
            return mInputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        }
        return super.onTouchEvent(event);
    }


    /**
     * 6、进度条方法组，方法数为3
     * 显示正在加载的进度条(不含内容)
     */
    public void showProgressDialog() {
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
        progressDialog = new ProgressDialog(MyBaseActivity.this);
        progressDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.animdraw));
        progressDialog.setCanceledOnTouchOutside(false);
        try {
            progressDialog.show();
        } catch (WindowManager.BadTokenException exception) {
            exception.printStackTrace();
        }
    }
    /***
     * 显示正在加载的进度条
     * @param msg 显示的内容
     */
    public void showProgressDialog(String msg) {
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
        progressDialog = new ProgressDialog(MyBaseActivity.this);
        progressDialog.setMessage(msg);
        progressDialog.setIndeterminateDrawable(getResources().getDrawable(R.drawable.animdraw));
        progressDialog.setCanceledOnTouchOutside(false);
        try {
            progressDialog.show();
        } catch (WindowManager.BadTokenException exception) {
            exception.printStackTrace();
        }
    }
    /**
     * 隐藏正在加载的进度条
     */
    public void dismissProgressDialog() {
        if (null != progressDialog && progressDialog.isShowing() == true) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    }

    /**
     * 7、获取宽高的方法组，方法数共2
     * 得到屏幕宽度
     * @return 宽度
     */
    public int getScreenWidth() {
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);//这句话很重要，它对dm进行了处理，使得我们可以通过dm获取宽高
        return dm.widthPixels;
    }
    /**
     * 得到屏幕高度
     * @return 高度
     */
    public int getScreenHeight() {
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);
        return dm.heightPixels;
    }

    /**
     *
     * 8、SnackBar的方法组，方法数共１
     * 短时间的SnackBar
     *
     * @param info 显示的信息
     */
    public void showSnackBar(String info) {
        Snackbar.make ( getWindow ().getDecorView ().findViewById ( android.R.id.content ), info, Snackbar.LENGTH_SHORT ).show ();
    }
    /**
     *
     * 9、eventbus的方法组，方法数共１
     * 仅仅是为了给Eventbus占位置，不然会报 你没有Subscribe方法还注册我干嘛的异常。
     * 这个异常是为了节省eventbus的开销，也挺好……
     */
    @Subscribe
    public void onEvent(TestEvent testEvent){
        BaseLog.e("TAG","Base onEvent执行了");
    }
}
